iT邦幫忙

0

(6) 研發看 MES:第一次把多個製程串成一條生產流程

mes
  • 分享至 

  • xImage
  •  

研發看 MES:第一次把多個製程串成一條生產流程

前面幾篇,我們已經完成了兩個基礎功能:
Machine(機台)
以及:
Process(製程)

現在 MES 已經知道工廠有哪些機台,也知道有哪些製程。
假設目前系統裡有:

Die Attach(固晶)
Wire Bond(打線)
Molding(封膠)
Inspection(檢查)

但是到目前為止,這四個 Process 都只是獨立存在的資料。
MES 還不知道:

哪一道要先做?

哪一道要後做?

做完這一站之後,下一站又是哪裡?

所以今天我們要開始建立:
Route(途程)

把原本獨立的 Process,真正串成一條可以執行的生產流程。

※ 本篇製程名稱主要用來說明 MES 流程設計,實際封裝製程會依產品與工廠而有所不同。

Process 跟 Route 有什麼差別?

我們先建立四個 Process:

P001    Die Attach
P002    Wire Bond
P003    Molding
P004    Inspection

這時 MES 只知道:

工廠裡有這四個製程。
但是不知道順序。

所以我們再建立:

ROUTE-A

並且告訴 MES:

① Die Attach
      ↓
② Wire Bond
      ↓
③ Molding
      ↓
④ Inspection

這時候才真正形成一條生產流程。
所以我自己會用一個很簡單的方式理解:
Process 定義「可以做什麼」。
Route 定義「要怎麼走」。

程式裡要怎麼表示順序?

Route 建立之後,第一個要解決的問題就是:
順序。
我們不可能只把四個 Process 丟進 Database,然後期待 MES 自己知道誰先誰後。

所以需要加入:
SEQ(Sequence)

例如:

ROUTE-A
SEQ    PROCESS
-----------------------
10     Die Attach
20     Wire Bond
30     Molding
40     Inspection

這樣 MES 就知道:

10 → 20 → 30 → 40

也就是:

Die Attach
    ↓
Wire Bond
    ↓
Molding
    ↓
Inspection

為什麼 SEQ 用 10、20、30?

看到這裡可能會有一個問題。
為什麼不是:

1
2
3
4

而是:

10
20
30
40

原因其實很單純:
留一點空間給未來修改。
假設原本:

10 → Die Attach
20 → Wire Bond
30 → Molding
40 → Inspection

某一天我們需要在 Wire Bond 與 Molding 中間增加一道製程。
就可以變成:

10 → Die Attach
20 → Wire Bond
25 → 新製程
30 → Molding
40 → Inspection

不需要因為中間插入一站,就把後面的 SEQ 全部重新編號。
這不是什麼很複雜的技術。
但這種小地方,通常會直接影響系統以後好不好維護。

Database 怎麼存 Route?

最直覺的方法可能是建立:

ROUTE

PROCESS_1
PROCESS_2
PROCESS_3
PROCESS_4

但這樣馬上會遇到問題。
如果某一條 Route 有 5 個 Process 呢?
那就增加:

PROCESS_5

如果另外一條有 20 個呢?
難道一路增加到:

PROCESS_20

顯然不太合理。

所以跟上一篇 Process 與 Machine 的關係一樣,我們可以把資料拆開。

ROUTE
   │
   └── ROUTE_PROCESS

ROUTE 負責記錄:

ROUTE_UUID
ROUTE_CODE
ROUTE_NAME
ENABLE

而 ROUTE_PROCESS 負責記錄:

ROUTE_UUID
PROCESS_UUID
SEQ

例如:

ROUTE_UUID    PROCESS_UUID    SEQ
---------------------------------
ROUTE-A       P001            10
ROUTE-A       P002            20
ROUTE-A       P003            30
ROUTE-A       P004            40

這樣不管一條 Route 有 3 個 Process、10 個 Process,甚至更多 Process,
資料結構都不需要跟著改變。

到這裡,MES 第一次知道「下一站」

這也是 Route 對後面 Lot Control 很重要的原因。

假設:

LOT-001

目前正在:

SEQ 20 → Wire Bond

當 Wire Bond 完成之後,MES 可以查看 Route:

10 → Die Attach
20 → Wire Bond       ← 現在
30 → Molding         ← 下一站
40 → Inspection

所以系統知道:

LOT-001 下一站應該前往 Molding。

這時我們的 MES 已經開始有一點「流程」的概念了。
但是如果所有 Lot 都永遠按照:

① → ② → ③ → ④

那 Route 其實還滿簡單的。

真正開始麻煩的是:
現場不一定永遠照正常流程走。

第一種例外:Locate(跳站)

假設正常 Route 是:

① Die Attach
      ↓
② Wire Bond
      ↓
③ Molding
      ↓
④ Marking
      ↓
⑤ Inspection

正常情況下,一個 Lot 應該走:

① → ② → ③ → ④ → ⑤

但是今天因為產品或生產條件不同,這個 Lot 不需要經過:
④ Marking

那它實際走過的路徑可能變成:

① → ② → ③ → ⑤
          ④ Skip

這就是:
Skip(跳站)

Locate 不只是「SEQ + 20」

如果只考慮程式怎麼跑,我們可能會覺得很簡單。

原本:

CURRENT_SEQ = 30
NEXT_SEQ    = 40

現在 Skip:

CURRENT_SEQ = 30
NEXT_SEQ    = 50

完成。

但 MES 不能只知道:

LOT-001 現在跑到 ⑤ 了。

因為未來有人查看 Lot History 時,很可能會問:

為什麼這批沒有經過 ④?

所以我們真正需要留下的是:

① → 完成
② → 完成
③ → 完成
④ → Skip
⑤ → 完成

也就是說:
Skip 本身也是一次生產事件。
它沒有真的進入這道製程生產,但我們仍然需要知道:

原本應該經過這一站,只是這次被跳過了。
這樣未來才有辦法追溯。

第二種例外:Rework(重工)

接下來是更有趣的:
Rework。
我們先從最簡單的情況開始。

正常 Route:

① Die Attach
      ↓
② Wire Bond
      ↓
③ Molding
      ↓
④ Inspection

正常 Lot 應該走:

① → ② → ③ → ④

但是 LOT-001 做到 ④ Inspection 時,發現有異常。
工程人員判斷:

這批需要從 ② 開始重新處理。

所以 LOT-001 最後真正走過的完整路徑就變成:

① → ② → ③ → ④ → ② → ③ → ④
              ↑
           發生重工

這樣就很容易看懂 Rework 到底發生在哪裡。

第一次:

① → ② → ③ → ④

做到 ④ 發現異常。
接著重新執行:

② → ③ → ④

所以 Lot History 最後看到的是:

① → ② → ③ → ④ → ② → ③ → ④

這就是最直覺的一種 Rework。

但 Rework 不一定只是「往前重做」

如果系統只支援:

選擇前面某一道 Process,然後重新跑一次。

其實還是會限制現場的使用方式。
因為有些異常處理,不一定存在於原本的正常 Route 裡。
我們繼續使用剛才的例子。

正常生產:

① Die Attach
      ↓
② Wire Bond
      ↓
③ Molding
      ↓
④ Inspection

LOT-001 做完 Inspection 後發現某種異常。
但這次工程人員不是要求:

回到 ② 重新做。

而是需要經過另外兩個異常處理製程。
假設是:

A Cleaning
      ↓
B Bake

處理完成之後,再回到:

④ Inspection

那這個 Lot 實際走過的完整路徑就是:

① → ② → ③ → ④ → A → B → ④
                  ↑
               發生重工

換成製程名稱就是:

Die Attach
    ↓
Wire Bond
    ↓
Molding
    ↓
Inspection
    ↓
發現異常
    ↓
Cleaning
    ↓
Bake
    ↓
Inspection

這同樣也是 Rework。
但是:

A → B

根本不存在原本的正常 Route 裡。

所以我們讓 Rework 可以指定另一條 Route

這就是我們在設計 Rework 時,希望保留的彈性。
正常 Route 可能是:

① → ② → ③ → ④

但是 Rework 可以另外設定。

例如:
Rework Route A

② → ③ → ④

Lot 最後實際走成:

① → ② → ③ → ④ → ② → ③ → ④

或者另外建立:
Rework Route B

A → B → ④

Lot 最後實際走成:

① → ② → ③ → ④ → A → B → ④

所以在我們目前的設計中:
Rework 不只是「回到上一站」。

而是可以依照需求:

指定另外一條重工途程。

這樣正常生產流程跟異常處理流程就不用全部寫死在程式裡。

為什麼我不想把 Rework 寫死?

假設我們直接在程式裡寫:

if process == "Inspection":
    rework_process = "Wire Bond"

現在確實可以處理:

① → ② → ③ → ④ → ② → ③ → ④

但是過一陣子,另外一個產品說:

Inspection 異常不是回 Wire Bond。

而是:

Cleaning → Bake → Inspection

我們又要改程式。
再來第三個產品:

Cleaning → Inspection

又要再改一次。

最後程式可能慢慢變成:

if product == "A":
    ...
elif product == "B":
    ...
elif product == "C":
    ...

這種流程一多,維護就會開始變得很痛苦。
所以我們選擇把:

Process
+
SEQ
+
Route

做成可以設定的資料。

讓使用者去定義:

正常流程怎麼走?
以及:
發生 Rework 時,要走哪一條流程?
系統負責按照設定執行。

Route 是「應該怎麼走」,History 是「實際怎麼走」

做到這裡,我覺得可以開始區分兩個很重要的概念。
Route 告訴 MES:

正常情況下,Lot 應該怎麼走。

例如:

① → ② → ③ → ④

但是 Lot 真正的生產歷史可能是:

正常生產

① → ② → ③ → ④

發生 Locate

① → ② → ④
      ③ Locate

發生 Rework

① → ② → ③ → ④ → ② → ③ → ④

使用另一條 Rework Route

① → ② → ③ → ④ → A → B → ④

所以:

Route 定義的是「應該怎麼走」。

Lot History 記錄的是「實際怎麼走」。

我覺得這是理解 MES Route 很重要的一個觀念。

從研發角度看 Route

回頭看,我們其實是在一步一步增加系統的複雜度。

機台設定:

Machine

只有單純的 Master Data。

製程設定:

Machine
   ↕
Process

開始產生資料關聯。

途程設定:

Process
   ↓
Route
   ↓
Process + SEQ

開始出現:
流程與順序。

而且當我們加入:
Locate
與:
Rework

之後,就會發現 MES 的流程並不是永遠:

1 → 2 → 3 → 4

它真正執行起來可能是:

1 → 2 → 3 → 4 → 2 → 3 → 4

也可能是:

1 → 2 → 3 → 4 → A → B → 4

所以從這一天開始,我們已經不只是在做 Master Data CRUD。

我們開始碰到 MES 真正重要的東西:
Flow Control(流程控制)。

Route 建立時,研發還要注意什麼?

最後回到實際開發。

建立一條 Route 時,API 可能收到:

{
    "route_code": "ROUTE-A",
    "processes": [
        {
            "process_uuid": "P001",
            "seq": 10
        },
        {
            "process_uuid": "P002",
            "seq": 20
        },
        {
            "process_uuid": "P003",
            "seq": 30
        }
    ]
}

這時後端至少要開始考慮:

  • Route Code 能不能重複?
  • Process 是否真的存在?
  • Process 是否已經停用?
  • SEQ 能不能重複?
  • Route 至少要不要有一個 Process?
  • 已經被使用的 Route 能不能直接修改?

尤其最後一個問題非常重要。

假設 LOT-001 已經按照:

10 → 20 → 30 → 40

生產到 20。

這時有人突然把 Route 修改成:

10 → 15 → 20 → 30 → 40

那 LOT-001 到底應該:
按照原本的 Route 繼續?
還是突然套用新的 Route?

這也是 MES 開發很常碰到的問題:
我們修改的是「現在的設定」,但工廠裡可能已經有 Lot 正在按照「以前的設定」生產。
這個問題等後面做到 Work Order 與 Lot 時,我們還會再次遇到。

現在我們已經完成:

Machine
   ↓
Process
   ↓
Route

MES 已經開始知道:
有哪些機台。
有哪些製程。
以及:
製程應該按照什麼順序執行。

接下來先做一個相對獨立、但是建立工單時會需要使用的 Master Data:
Customer(客戶)。

下一篇:
「客戶資料只是 CRUD?從聯絡人開始看一對多資料設計。」

認識我們
聯繫我們

章節列表


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言